package com.skt.domain.VO;

import com.skt.domain.PO.User;
import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.time.LocalDateTime;

/**
 * 用户视图对象（用于返回给前端，不包含敏感字段如密码）
 *
 * DB（数据库表）：存储持久化数据的源头。
 * PO（Persistent Object）：与数据库表结构完全一致，用于 ORM 框架操作数据库。
 * DTO（Data Transfer Object）：接收前端传入的数据，用于业务处理（如注册、更新），字段由前端输入需求决定。
 * VO（View Object）：返回给前端展示的数据，字段由前端展示需求决定，绝不包含敏感信息（如密码）。
 *
 * PO 不直接暴露给外部，仅在数据访问层（DAO/Repository）和业务层（Service）内部使用；
 * DTO 和 VO 通常由 PO 转换而来，可通过 MapStruct、BeanUtils 或手动转换；
 * DTO 可能包含校验注解（如 @NotBlank），VO 通常不含校验逻辑；
 * 一个实体可能对应多个 DTO/VO（如 UserRegisterDTO、UserUpdateDTO、UserSimpleVO）。
 */
@Data
public class UserVO {

    /**
     * 用户ID
     */
    private Long id;

    /**
     * 用户名（登录用）
     */
    private String username;

    /**
     * 真实姓名
     */
    private String realName;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 角色：1-普通用户，2-管理员
     */
    private Byte role;

    /**
     * 状态：1-正常，0-禁用
     */
    private Byte status;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * token
     */
    private String token;

    public static UserVO from(User user) {
        if (user == null) {
            return null;
        }
        UserVO vo = new UserVO();
        BeanUtils.copyProperties(user, vo);
        return vo;
    }
}